"""
不定参数也可以叫做 万能参数
意思是，随便你传递多少个都可以。
当然，函数能不能处理是编写者需要考虑的事情。
不定参数也会和后面的 装饰器 关联，后面会做介绍。
"""

# *
# def add(x, y, *args):
#     sum = x + y
#     for arg in args:
#         sum += arg
#
#     print(sum)
#
# add(1, 2)
# add(1, 2, 4, 5, 6, 7, 8)

"""
*args 中，args只是参数名，可以叫其他名字都可以
重要的是 *，这个符号可以将多余的参数 塞入 定义的参数名中
比如上述代码中 4, 5, 6, 7, 8 即为多余的参数，我们可以将它全部的塞入 args中
所以，想要容纳 不定数量 的参数，args最终的形态肯定是一个容器，python将其规定为 元组 类型
也是因为 元组的值不可变
"""

# **
# 上述介绍的是 不定参数中的位置参数
# 下面介绍的是 不定参数中的关键字参数

# def userInfo(username, age, **kwargs):
#     print(f"我叫 {username}, 今年 {age}")
#     if kwargs:
#         print(f"对了我还有其他的信息可以告诉你")
#         for key, value in kwargs.items():
#             print(f"我的 {key} 为 {value}")
#
# userInfo('muzhou', '18')
# userInfo(username="木舟", age="18", sex='male', city='成都')
# userInfo(username="木舟", age="18", sex='male', city='成都')

"""
同样，kwargs 也只是个名字, 可以叫其他的
前面有两个 * 则为 不定参数中的关键字参数
最终的形态为 字典
因为只有 字典 是 key-value 结构, 能够很好的存取关键字参数
但因为字典的特性, kwargs的值是可以被修改的, 使用时需要注意.
"""

# 为什么叫做万能参数

# def test(*args, **kwargs):
#     print(args)
#     print(kwargs)
#
# test(1, 2, a=3, b=4)